CMSimfly 動態系統的網際編輯器採用 TinyMCE4, 可以放入一般超文件, 納入圖檔, 嵌入影片連結, 並且加入帶有行數的原始碼.
透過 File Upload 功能, 可以一次上傳多個檔案, 存入 downloads 目錄中儲存, 之後各頁面可以引入對應連結.
而圖檔的上傳與引用與一般檔案類似, 但上傳後存入 images 目錄中.
CMSimfly 目前使用 Syntaxhighlighter 3.0.83:
http://alexgorbatchev.com/SyntaxHighlighter/
進行頁面中的程式碼高亮顯示.
import java.util.Scanner; public class Life { public static void show(boolean[][] grid){ String s = ""; for(boolean[] row : grid){ for(boolean val : row) if(val) s += "*"; else s += "."; s += "\n"; } System.out.println(s); } public static boolean[][] gen(){ boolean[][] grid = new boolean[10][10]; for(int r = 0; r < 10; r++) for(int c = 0; c < 10; c++) if( Math.random() > 0.7 ) grid[r][c] = true; return grid; } public static void main(String[] args){ boolean[][] world = gen(); show(world); System.out.println(); world = nextGen(world); show(world); Scanner s = new Scanner(System.in); while(s.nextLine().length() == 0){ System.out.println(); world = nextGen(world); show(world); } } public static boolean[][] nextGen(boolean[][] world){ boolean[][] newWorld = new boolean[world.length][world[0].length]; int num; for(int r = 0; r < world.length; r++){ for(int c = 0; c < world[0].length; c++){ num = numNeighbors(world, r, c); if( occupiedNext(num, world[r][c]) ) newWorld[r][c] = true; } } return newWorld; } public static boolean occupiedNext(int numNeighbors, boolean occupied){ if( occupied && (numNeighbors == 2 || numNeighbors == 3)) return true; else if (!occupied && numNeighbors == 3) return true; else return false; } private static int numNeighbors(boolean[][] world, int row, int col) { int num = world[row][col] ? -1 : 0; for(int r = row - 1; r <= row + 1; r++) for(int c = col - 1; c <= col + 1; c++) if( inbounds(world, r, c) && world[r][c] ) num++; return num; } private static boolean inbounds(boolean[][] world, int r, int c) { return r >= 0 && r < world.length && c >= 0 && c < world[0].length; } }
def parse_content(): """use bs4 and re module functions to parse content.htm""" #from pybean import Store, SQLiteWriter # if no content.db, create database file with cms table ''' if not os.path.isfile(config_dir+"content.db"): library = Store(SQLiteWriter(config_dir+"content.db", frozen=False)) cms = library.new("cms") cms.follow = 0 cms.title = "head 1" cms.content = "content 1" cms.memo = "first memo" library.save(cms) library.commit() ''' # if no content.htm, generate a head 1 and content 1 file if not os.path.isfile(config_dir+"content.htm"): # create content.htm if there is no content.htm File = open(config_dir + "content.htm", "w", encoding="utf-8") File.write("<h1>head 1</h1>content 1") File.close() subject = file_get_contents(config_dir+"content.htm") # deal with content without content if subject == "": # create content.htm if there is no content.htm File = open(config_dir + "content.htm", "w", encoding="utf-8") File.write("<h1>head 1</h1>content 1") File.close() subject = "<h1>head 1</h1>content 1" # initialize the return lists head_list = [] level_list = [] page_list = [] # make the soup out of the html content soup = bs4.BeautifulSoup(subject, 'html.parser') # 嘗試解讀各種情況下的標題 soup = _remove_h123_attrs(soup) # 改寫 content.htm 後重新取 subject with open(config_dir + "content.htm", "wb") as f: f.write(soup.encode("utf-8")) subject = file_get_contents(config_dir+"content.htm") # get all h1, h2, h3 tags into list htag= soup.find_all(['h1', 'h2', 'h3']) n = len(htag) # get the page content to split subject using each h tag temp_data = subject.split(str(htag[0])) if len(temp_data) > 2: subject = str(htag[0]).join(temp_data[1:]) else: subject = temp_data[1] if n >1: # i from 1 to i-1 for i in range(1, len(htag)): head_list.append(htag[i-1].text.strip()) # use name attribute of h* tag to get h1, h2 or h3 # the number of h1, h2 or h3 is the level of page menu level_list.append(htag[i-1].name[1]) temp_data = subject.split(str(htag[i])) if len(temp_data) > 2: subject = str(htag[i]).join(temp_data[1:]) else: subject = temp_data[1] # cut the other page content out of htag from 1 to i-1 cut = temp_data[0] # add the page content page_list.append(cut) # last i # add the last page title head_list.append(htag[n-1].text.strip()) # add the last level level_list.append(htag[n-1].name[1]) temp_data = subject.split(str(htag[n-1])) # the last subject subject = temp_data[0] # cut the last page content out cut = temp_data[0] # the last page content page_list.append(cut) return head_list, level_list, page_list
請注意, 目前 CMSimfly 標題內文無法解讀 "/" 符號, 因此若本頁面的標題為 "C/C++程式碼", 則無法進行分頁.
/* Runge Kutta for a set of first order differential equations */ #include <stdio.h> #include <math.h> #define N 2 /* number of first order equations */ #define dist 0.1 /* stepsize in t*/ #define MAX 30.0 /* max for t */ FILE *output; /* internal filename */ FILE *output1; /* internal filename */ // 利用 pipe 呼叫 gnuplot 繪圖 FILE *pipe; void runge4(double x, double y[], double step); /* Runge-Kutta function */ double f(double x, double y[], int i); /* function for derivatives */ void main(){ double t, y[N]; int j; output=fopen("osc.dat", "w"); /* external filename */ output1=fopen("osc1.dat", "w"); /* external filename */ y[0]=1.0; /* initial position */ y[1]=0.0; /* initial velocity */ //fprintf(output, "0\t%f\n", y[0]); for (j=1; j*dist<=MAX ;j++) /* time loop */{ t=j*dist; runge4(t, y, dist); fprintf(output, "%f\t%f\n", t, y[0]); fprintf(output1, "%f\t%f\n", t, y[1]); } fclose(output); fclose(output1); pipe = popen("gnuplot -persist","w"); //fprintf(pipe,"set term png enhanced font \"v:/fireflysung.ttf\" 18 \n"); fprintf(pipe,"set term png enhanced font \"y:/wqy-microhei.ttc\" 18 \n"); //fprintf(pipe,"set yrange [68:70]\n"); fprintf(pipe,"set output \"test.png\"\n"); fprintf(pipe, "plot \"osc.dat\" title \"位移\" with lines, \"osc1.dat\" title \"速度\" with lines\n"); fprintf(pipe,"quit\n"); fprintf(pipe,"quit\n"); pclose(pipe); } void runge4(double x, double y[], double step){ double h=step/2.0, /* the midpoint */ t1[N], t2[N], t3[N], /* temporary storage arrays */ k1[N], k2[N], k3[N],k4[N]; /* for Runge-Kutta */ int i; for (i=0;i<N;i++){ t1[i]=y[i]+0.5*(k1[i]=step*f(x,y,i)); } for (i=0;i<N;i++){ t2[i]=y[i]+0.5*(k2[i]=step*f(x+h, t1, i)); } for (i=0;i<N;i++){ t3[i]=y[i]+ (k3[i]=step*f(x+h, t2, i)); } for (i=0;i<N;i++){ k4[i]= step*f(x+step, t3, i); } for (i=0;i<N;i++){ y[i]+=(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6.0; } } double f(double x, double y[], int i){ if (i==0) x=y[1]; /* derivative of first equation */ if (i==1) x=-y[0]-0.5*y[1]; return x; }
-- 導入 js 模組 js = require("js") -- 取得 window window = js.global -- 猜小於或等於 n 的整數 big = 100 -- 計算猜測次數, 配合 while 至少會猜一次 num = 1 -- 利用 window:prompt 方法回應取得使用者所猜的整數 guess = window:prompt("請猜一個介於 1 到 "..big.." 的整數") -- 利用數學模組的 random 函數以亂數產生答案 answer = math.random(big) output = "" -- 若沒猜對, 一直猜到對為止 while answer ~= tonumber(guess) do if answer > tonumber(guess) then output = "猜第 "..num.." 次, guess="..guess..", answer="..answer.." - too small" print(output) else output = "猜第 "..num.." 次, guess="..guess..", answer="..answer.." - too big" print(output) end guess = window:prompt(output..", 請猜一個介於 1 到 "..big.." 的整數") num = num + 1 end print("總共猜了 "..num.." 次, answer=guess="..answer.." - correct")
STLViewer = function(stlpath, plotarea) { var mycanvas = document.getElementById(plotarea); var viewer = new JSC3D.Viewer(mycanvas) var theScene = new JSC3D.Scene; ////Initialize with a default file: //var stlpath = "../../../assets/2013-10-23/stl/box.STL" //var stlpath = "../../../assets/2013-10-23/stl/taj.stl" viewer.setParameter('SceneUrl', stlpath); viewer.setParameter('InitRotationX', 20); viewer.setParameter('InitRotationY', 20); viewer.setParameter('InitRotationZ', 0); viewer.setParameter('ModelColor', '#CAA618'); viewer.setParameter('BackgroundColor1', '#FFFFFF'); viewer.setParameter('BackgroundColor2', '#383840'); viewer.init(); viewer.update(); ////init done var canvas_drop = document.getElementById('canvas-drop') /*var dropzone = document.getElementById('dropzone') dropzone.addEventListener('dragover', handleDragOver, false); dropzone.addEventListener('drop', handleFileSelect, false); */ canvas_drop.addEventListener('dragover', handleDragOver, false); canvas_drop.addEventListener('drop', handleFileSelect, false); ////Drag and drop logic: function handleFileSelect(evt) { evt.stopPropagation(); evt.preventDefault(); var files = evt.dataTransfer.files; console.log(evt) console.log(files) preview_stl(files[0]) } function handleDragOver(evt) { evt.stopPropagation(); evt.preventDefault(); evt.dataTransfer.dropEffect = 'copy'; } ////jsc3d logic var handle_file_select = function(e) { e.stopPropagation() e.preventDefault() var f = e.target.files[0] preview_stl(f) } function preview_stl(f) { var reader = new FileReader() var ext = f.name.split(".")[1] function setup_viewer() { viewer.setParameter('InitRotationX', 20); viewer.setParameter('InitRotationY', 20); viewer.setParameter('InitRotationZ', 0); viewer.setParameter('ModelColor', '#CAA618'); viewer.setParameter('BackgroundColor1', '#FFFFFF'); viewer.setParameter('BackgroundColor2', '#383840'); viewer.setParameter('RenderMode', "flat"); } setup_viewer() reader.onload = (function(file) { return function(e) { theScene = new JSC3D.Scene stl_loader = new JSC3D.StlLoader() stl_loader.parseStl(theScene, e.target.result) //viewer.init() viewer.replaceScene(theScene) viewer.update() console.log("file reader onload") } })(f) if (ext.toLowerCase() != "stl") { alert("That doesn't appear to be an STL file."); } else { reader.readAsBinaryString(f) } } }
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>CMSimfly</title> <link rel="stylesheet" type="text/css" href="/static/cmsimply.css"> </head> <body> <div class='container'> <nav> <ul id='css3menu1' class='topmenu'> <li><a href='/get_page/簡介'>簡介</a> <li><a href='/get_page/目錄結構'>目錄結構</a> <li> <a href='/get_page/頁面編輯'>頁面編輯</a> <ul> <li> <a href='/get_page/插入程式碼'>插入程式碼</a> <ul> <li><a href='/get_page/Java 程式碼'>Java 程式碼</a> <li><a href='/get_page/Python 程式碼'>Python 程式碼</a> <li><a href='/get_page/C或C++程式碼'>C或C++程式碼</a> <li><a href='/get_page/Lua 程式碼'>Lua 程式碼</a> <li><a href='/get_page/Javascript 程式碼'>Javascript 程式碼</a> <li><a href='/get_page/Html 原始碼'>Html 原始碼</a></li> </li> </ul> </ul> <li><a href='/get_page/網際簡報'>網際簡報</a> <li><a href='/get_page/網誌編輯'>網誌編輯</a> <li><a href='/get_page/已知錯誤'>已知錯誤</a></li> </ul> </nav> <section> <form method='post' action='/ssavePage'> <textarea class='simply-editor' name='page_content' cols='50' rows='15'><h3>Html 原始碼</h3></textarea> <input type='hidden' name='page_order' value='9'> <input type='submit' value='save'> <input type=button onClick="location.href='/get_page/Html 原始碼'" value='viewpage'> </form> </section> </body> </html> COPY TO CLIPBOARD